﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Xml;
using NUnit.Framework;
using smp.QueryDb.Structure;

namespace smp.QueryDb.Tests
{
    [TestFixture]
    public class Class1
    {
        [Test]
        public void Test00()
        {
            var generator = new Tools.SqlStructureGenerator();
            var connectionSTring = ConfigurationManager.ConnectionStrings["test"].ConnectionString;
            Console.WriteLine(generator.GetClassStringForAllAllObjects(connectionSTring, "smp.QueryDb.Tests"));
        }

        [Test]
        public void Test01()
        {
            var generator = new Tools.SqlStructureGenerator();
            var connectionSTring = ConfigurationManager.ConnectionStrings["test"].ConnectionString;
            var tables = new List<Table>();
            tables.Add(QueryDbTest.Address);
            tables.Add(QueryDbTest.Customer);
            tables.Add(QueryDbTest.Product);
            tables.Add(QueryDbTest.Order);
            tables.Add(QueryDbTest.OrderProducts);
            Console.WriteLine(generator.GenerateCreateTableScript(tables));
        }


        //[Test]
        //public void Test01()
        //{
        //    var query = new Query<ViewModel1>()
        //        .From(Db.Table1.As("t1"));
        //    //Console.WriteLine(query.FromStatement);

        //    query = new Query<ViewModel1>()
        //        .From(Db.Table1.As("t1")
        //                  .Join(new Join(Db.Table2)
        //                            .On(Table1.Table2Id)
        //                            .IsEqualTo(Table2.Id)
        //                            .And(Table1.Name)
        //                            .IsNotEqualTo(Table2.Value)));
        //    //only thing missing here is the ability to sub join...

        //    Console.WriteLine();
        //    //Console.WriteLine(query.FromStatement);

        //    query = new Query<ViewModel1>()
        //        .From(Db.Table1.As("t1")
        //                  .Join(new Join(Db.Table2.As("t2"))
        //                            .On(Table1.Table2Id)
        //                            .IsEqualTo(Table2.Id))
        //                  .Join(new Join(Db.Junction1.As("j"))
        //                            .On(Table1.Id)
        //                            .IsEqualTo(Junction1.Table1Id)
        //                            .SubJoin(new Join(Db.Table2.As("jt2"))
        //                                         .On(Junction1.Table2Id)
        //                                         .IsEqualTo(Table2.Id))));
        //    Console.WriteLine();
        //    //Console.WriteLine(query.FromStatement);
        //}

        //[Test]
        //public void Test02()
        //{
        //    var query = new Query<ViewModel1>()
        //        .From(Db.Table1
        //                  .Join(new Join(Db.Table2)
        //                            .On(Table1.Table2Id)
        //                            .IsEqualTo(Table2.Id)))
        //        .Map(x => x.Id).To(Table1.Id)
        //        .Map(x => x.Name).To(Table1.Name)
        //        .Map(x => x.Value).To(Table2.Value);
        //    //Console.WriteLine(query.ColumnStatement);
        //    Console.WriteLine();

        //    query = new Query<ViewModel1>()
        //        .From(Db.Table1.As("t1")
        //                  .Join(new Join(Db.Table2.As("T2"))
        //                            .On(Table1.Table2Id)
        //                            .IsEqualTo(Table2.Id)))
        //        .Map(x => x.Id).To(Table1.Id.On("t1"))
        //        .Map(x => x.Name).To(Table1.Name.On("t1"))
        //        .Map(x => x.Value).To(Table2.Value.On("T2"));
        //    //Console.WriteLine(query.ColumnStatement);
        //    Console.WriteLine();

        //    var query2 = new Query<ViewModel2>()
        //        .From(Db.Table1
        //                  .Join(new Join(Db.Table2)
        //                            .On(Table1.Table2Id)
        //                            .IsEqualTo(Table2.Id)))
        //        .Map(x => x.Id).To(Table1.Id)
        //        .Map(x => x.Nested).ToNested(new NestedMap<ViewModel3>()
        //                                         .Map(x => x.Value).To(Table2.Value));
        //    //Console.WriteLine(query2.ColumnStatement);
        //    Console.WriteLine();

        //    query2 = new Query<ViewModel2>()
        //        .From(Db.Table1.As("t1")
        //                  .Join(new Join(Db.Table2.As("T2"))
        //                            .On(Table1.Table2Id)
        //                            .IsEqualTo(Table2.Id)))
        //        .Map(x => x.Id).To(Table1.Id.On("t1"))
        //        .Map(x => x.Nested).ToNested(new NestedMap<ViewModel3>()
        //                                         .Map(x => x.Value).To(Table2.Value.On("T2")));
        //    //Console.WriteLine(query2.ColumnStatement);
        //    Console.WriteLine();
        //}

        //[Test]
        //public void Test03()
        //{
        //    var query = new Query<ViewModel1>()
        //        .From(Db.Table1
        //                  .Join(new Join(Db.Table2)
        //                            .On(Table1.Table2Id)
        //                            .IsEqualTo(Table2.Id)))
        //        .Where(new Filter<ViewModel1>(x => x.Name).Is.EqualTo("hello")
        //                   .Or(x => x.Name).Is.EqualTo("goodbye"))
        //        .Map(x => x.Id).To(Table1.Id)
        //        .Map(x => x.Name).To(Table1.Name)
        //        .Map(x => x.Value).To(Table2.Value)
        //        .OrderBy(Table1.Name)
        //        .OrderByDescending(x => x.Value);
        //    query.PrintSqlStatement();

        //    query = new Query<ViewModel1>()
        //        .From(Db.Table1.As("t1")
        //                  .Join(new Join(Db.Table2.As("t2"))
        //                            .On(Table1.Table2Id)
        //                            .IsEqualTo(Table2.Id)))
        //        .Where(new Filter<ViewModel1>(x => x.Name).Is.EqualTo("hello")
        //                   .Or(x => x.Name).Is.EqualTo("goodbye"))
        //        .Map(x => x.Id).To(Table1.Id.On("t1"))
        //        .Map(x => x.Name).To(Table1.Name.On("t1"))
        //        .Map(x => x.Value).To(Table2.Value.On("t2"))
        //        .OrderBy(Table1.Name.On("t1"))
        //        .OrderByDescending(x => x.Value)
        //        .TakePage(1).ForPageSize(10);
        //    query.PrintPagedSqlStatement();

        //    query.TakePage(2).ForPageSize(50);
        //    query.PrintPagedSqlStatement();
        //}

        //[Test]
        //public void Test04()
        //{
        //    var viewQuery = new Query<ViewModel1>()
        //        .From(Db.Table1.As("t1")
        //                  .Join(new Join(Db.Table2)
        //                            .On(Table1.Table2Id)
        //                            .IsEqualTo(Table2.Id)))
        //        .Where(new Filter<ViewModel1>(x => x.Name).Is.EqualTo("hello")
        //                   .Or(x => x.Name).Is.EqualTo("goodbye"))
        //        .Map(x => x.Id).To(Table1.Id.On("t1"))
        //        .Map(x => x.Name).To(Table1.Name.On("t1"))
        //        .Map(x => x.Value).To(Table2.Value)
        //        .OrderBy(Table1.Id.On("t1"))
        //        .OrderByDescending(x => x.Name);
        //    viewQuery.PrintSqlStatement();

        //    var rawQuery = new Query()
        //        .From(Db.Table1.As("t1")
        //                  .Join(new Join(Db.Table2)
        //                            .On(Table1.Table2Id)
        //                            .IsEqualTo(Table2.Id)))
        //        .Where(new Filter(Table1.Name.On("t1")).Is.EqualTo("hello")
        //                   .Or(Table1.Name.On("t1")).Is.EqualTo("goodbye"))
        //        .Select(Table1.Id.On("t1"))
        //        .Select(Table1.Name.As("Table1Name"))
        //        .Select(Table2.Value)
        //        .OrderBy(Table1.Id.On("t1"))
        //        .OrderByDescending(Table1.Name.On("t1"));
        //    rawQuery.PrintSqlStatement();
        //}

        //[Test]
        //public void Test05()
        //{
        //    var contents =
        //        File.ReadAllLines(@"C:\test.txt").ToList();

        //    var foundFiles = false;
        //    var insertIndex = 0;
        //    for(int i = 0; i < contents.Count; i++)
        //    {
        //        var line = contents[i];
        //        if (line.Contains("Compile Include"))
        //        {
        //            foundFiles = true;
        //        }
        //        if (foundFiles && line.Contains("BIGTESTCLASS1.cs"))
        //        {
        //            break;
        //        }
        //        if(foundFiles && line.Contains("</ItemGroup>"))
        //        {
        //            insertIndex = i;
        //            break;
        //        }
        //    }
        //    if(insertIndex > 0)
        //    {
        //        contents.Insert(insertIndex, "\t\t<Compile Include=\"BIGTESTCLASS1.cs\" />");
        //    }

        //    foreach(var line in contents)
        //    {
        //        Console.WriteLine(line);
        //    }

        //    File.WriteAllLines(@"C:\test.txt", contents.ToArray());
        //}
    }


    //public class ViewModel1
    //{
    //    public Guid Id { get; set; }
    //    public string Name { get; set; }
    //    public string Value { get; set; }
    //}
    //public class ViewModel2
    //{
    //    public Guid Id { get; set; }
    //    public ViewModel3 Nested { get; set; }
    //}
    //public class ViewModel3
    //{
    //    public string Value { get; set; }
    //}
    //public class ViewModel4
    //{
    //    public string Name { get; set; }
    //    public List<ViewModel3> List { get; set; }
    //    public ViewModel5 ViewModel5 { get; set; }
    //}
    //public class ViewModel5
    //{
    //    public string Name { get; set; }
    //    public ViewModel1 ViewModel1 { get; set; }
    //}

    //public class Db
    //{
    //    public static Table1 Table1 { get { return new Table1(); } }
    //    public static Table2 Table2 { get { return new Table2(); } }
    //    public static Junction1 Junction1 {get { return new Junction1(); }}
    //}
    //public class Table1 : Table
    //{
    //    public Table1() : base("Table1")
    //    {
    //        Id = SetId("Id", DbType.Guid);
    //        Name = AddColumn("Name", DbType.String);
    //        LastUpdated = AddColumn("LastUpdated", DbType.DateTime);
    //        Table2Id = AddColumn("Table2Id", DbType.Guid);
    //    }
    //    public static Id Id;
    //    public static Column Name;
    //    public static Column LastUpdated;
    //    public static Column Table2Id;
    //}
    //public class Table2 : Table
    //{
    //    public Table2() : base("Table2")
    //    {
    //        Id = SetId("Id", DbType.Guid);
    //        Value = AddColumn("Value", DbType.String);
    //        Table1Id = AddColumn("Table1Id", DbType.Guid);
    //    }
    //    public static Id Id;
    //    public static Column Value;
    //    public static Column Table1Id;
    //}
    //public class Junction1 : Table
    //{
    //    public Junction1() : base("test", "dbo", "Junction1")
    //    {
    //        Id = SetId("Id", DbType.Guid);
    //        Table1Id = AddColumn("Table1Id", DbType.Guid, true);
    //        Table2Id = AddColumn("Table2Id", DbType.Guid);
    //    }
    //    public static Id Id;
    //    public static Column Table1Id;
    //    public static Column Table2Id;
    //}
}
